package com.dy.design_pattern_study.design_pattern_principles;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-18
 * @Content 合成/聚合复用原则 Composition/Aggregation Principle
 * 合成／聚合复用原则（CARP），尽量使用合成／聚合，尽量不要使用类继承。
 */
public class CompositionORAggregationPrinciple {
/*
    1.聚合与合成的含义
 * 聚合表示一种弱的‘拥有’关系，体现的是A对象可以包含B对象，但B对象不是A对象的一部分；
 * 简单的说 --聚合就是 A可用B的功能
 * ------------
 * 合成则是一种强的‘拥有’关系，体现了严格的部分和整体的关系，部分和整体的生命周期一样
 * 简单的说 A拥有B和C，B 和 C 合成 A，部分与整体的关系
 */

    /*
       2.好处
        优先使用对象的合成/聚合将有助于你保持每个类被封装，并被集中在单个任务上。
        这样类和类继承层次会保持较小规模，并且不太可能增长为不可控制的庞然大物
        --------------------------------------------------------
        简单的说
            1.就是在多继承的时候，适当的把相同的属性抽出来，然后进行合成/聚合，减少继承，实现功能

            2.合成/聚合复用原则是在一个新的对象里面使用一些已有的对象，
            使之成为新对象的一部分；新的对象通过向这些对象的委派达到复用已有功能的目的。
     */

    /*
        3.合成、聚合关系的代码探究
        合成关系 -可参考桥接模式 --就是没你也行的关系

        聚合（依赖）关系 --就是非你不可的关系
     */

}
//合成关系
class Student {
}
class Classes{
    private Student student;
    public Classes(Student student){
        //这里仅传入类，实现合成的功能，后面也可以调用对应的 student的方法 --没你也行
        this.student=student;
    }
}


///---------
//聚合（依赖）关系
class Room {
    public Room createRoom() {
        System.out.println("创建房间");
        return new Room();
    }
}

class House {
    private Room room;

    public House() {
        //直接创建一个类并使用其方法，达到依赖效果 --非你不可
        room = new Room();
    }
    public void createHouse() {
        //使用其方法
        room.createRoom();
    }
}